perm filename DSKDMP.FAI[SS,SYS]4 blob
sn#350227 filedate 1978-04-24 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00016 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 ASSEMBLY SWITCHES, TITLE AND AC DEFINITIONS
C00007 00003 WRITE OUT RIM FORMAT BOOT, PNCHGO
C00010 00004 PETIT CHANNEL DEFINITIONS
C00014 00005 C1 CHANNEL DEFINITIONS
C00016 00006 C1 CHANNEL DATA AREA PARAMETERS
C00025 00007 FILE SYSTEM PARAMETERS
C00027 00008 DSKDMP.DMP FORMAT
C00028 00009 BOOT BEGINS HERE
C00032 00010 DSKDMP BEGINS HERE
C00043 00011 FILSET
C00045 00012 SUBROUTINES TO RUN THE DISK SEEK,XWAIT,SETUP,DSKERR
C00049 00013 SRCH, RDRET, READ, BLAST
C00059 00014 TYPE, TYO, TYI, FILTYP, PPNTYP, TWAIT
C00063 00015 DISK ADDRESSES AND POINTERS
C00069 00016 LIT
C00070 ENDMK
C⊗;
;ASSEMBLY SWITCHES, TITLE AND AC DEFINITIONS
DEBSW←←0 ;IF BOOT, 0 FOR PAPER TAPE, 1 FOR DECTAPE WITH EDDT
;IF DSKDMP, 0 FOR REAL DSKDMP, 1 FOR DSKDMP WITH EDDT
DSKDSW←←1 ;0 FOR BOOT, 1 FOR DSKDMP
DSKDBG←←0 ;1 FOR BEING ABLE TO LOAD DSKDMP WITH EDDT
KLBOOT←←1 ;IF BOOT, 1 FOR KLDCP LOADABLE BOOT, 0 FOR PAPER TAPE
NEWDSK←←1 ;KNOWS ABOUT C1 CHANNEL
OLDDSK←←0 ;KNOWS ABOUT PETIT CHANNEL
NPACKS←←6
DEFINE SWLIST <FOR SWITCH IN (DEBSW,DSKDSW,DSKDBG,KLBOOT,OLDDSK,NEWDSK)>
DEFINE VALPNT (VAL) <
PRINTS /VAL/
>
PRINTS /SWITCHES ARE:
/
SWLIST <
PRINTS /SWITCH(/
VALPNT (\SWITCH)
PRINTS /) /
>
PRINTS /
TYPE NEW VALUES FOR THESE SYMBOLS, IF ANY, FOLLOWED BY CONTROL-META-LF
/
.INSERT TTY:
SWLIST <
IFN SWITCH,<↓SWITCH←←1>
IFE SWITCH,<↓SWITCH←←0>
>
IFN DSKDSW,<KLBOOT←←0>
IFN KLBOOT,<
DEBSW←←0
DSKDBG←←0
>;KLBOOT
IFN DSKDSW,<
TITLE DSKDMP
>;DSKDSW
IFE DSKDSW,<
TITLE BOOT
>;IFE DSKDSW
F←0
A←1
B←2
C←3
D←4
E←5
H←7
J←10
K←11
L←12
M←13
N←14
T←15
TT←16
P←17
HILOC←←135
NUFDWD←←20
IFN DSKDSW,<
;RIGHT HALF F BITS
RBO←←1 ;DOING RUBOUT NOW
>;DSKDSW
↓CUADR←←6 ;CONTROL UNIT ADDRESS
APR←←0
PI←←4
KLPAG←←10
CCA←←14
TTY←←120
IFN NEWDSK,<
C1A←←140
C1B←←144
>;IFN NEWDSK
DTE0←←200
IFN OLDDSK,<
PMP←←500
IBM←←504
>;IFN OLDDSK
;KL10 PARAMETERS, ETC.
DTFLG←←444 ;DTE20 OPERATION COMPLETE FLAG
DTF11←←450 ; FROM 11 ARGUMENT
DTCMD←←451 ; TO 11 COMMAND
DEFINE SKPKA <CONSO TTY,1B28> ;SKIP IF THIS IS THE KA10
DEFINE SKPKL <CONSZ TTY,1B28> ;SKIP IF THIS IS THE KL10
DONG11←←20000 ;DTE CONO BIT. REQUEST 11 INTERRUPT
SWEEPB←←200000 ;KL10 APR CONI BIT - SWEEP BUSY
PIOFF←←400
IFN DEBSW,<
LOC 74
JRST DDT↑
IFN DSKDSW,<
LOC 140
274
FF
LOWEST
>;DSKDSW
LOC 300
JRST DDT
IFE DSKDSW,<
JRST BOOT
LOC 100000
>;IFE DSKDSW
IFN DSKDSW,<
JRST DSKDMP
LOC 300000
>;DSKDSW
>;DEBSW
IFE DEBSW,<
IFN DSKDSW,<
LOC 140
760000 ;LOCATION FOR LOADING STARTING AT 274
FF ;FIRST FREE
LOWEST ;LOWEST LOCATION USED
LOC 274
PHASE 760000
>;DSKDSW
>;DEBSW
;WRITE OUT RIM FORMAT BOOT, PNCHGO
IFE DSKDSW,<
IFE KLBOOT,<
IFE DEBSW,<
PTPC←←1
PTR←←104
LOC 200
PNCHGO: RESET
MOVE P,[-20,,RIMPDL]
INIT PTPC,13
SIXBIT /PTP/
OBUF,,
JRST 4,.
MOVSI C,-RIMLDL
GO1: MOVE A,RIMLDR(C)
PUSHJ P,PUNCH
AOBJN C,GO1
MOVEI D,0 ;INITIALIZE CHECKSUM
MOVE A,[BOOTBG,,BOOTBG]
PUSHJ P,PUNCHC
MOVSI C,BOOTBG
GO2: MOVE A,BOOTLO(C)
PUSHJ P,PUNCHC ;PUNCH AND CHECKSUM
AOBJN C,GO2
MOVE A,D
PUSHJ P,PUNCH ;PUNCH OUT CHECKSUM
MOVE A,[JRST BOOT]
PUSHJ P,PUNCH
MOVEI A,0
PUSHJ P,PUNCH
EXIT
PUNCHC: ROT D,1
ADD D,A
PUNCH: SOSG OBUF+2
OUT PTPC,
CAIA
JRST 4,.
IDPB A,OBUF+1
POPJ P,
RIMLDR: -17,,0 ;IOWD TO RIM LOADER
CONO PTR,60
HRRI 11,4
CONSO PTR,10
JRST 3
ROT 0,-2(11)
DATAI PTR,@10(11)
XCT 10(11)
XCT 13(11)
SOJA 11,0
CAME 0,17
ADD 0,(17)
SKIPL 17,0
JRST 4,1
AOBJN 17,3
JRST 2
RIMLDL←←.-RIMLDR
RIMPDL: BLOCK 20
OBUF: BLOCK 3
LIT
VAR
LOC 1000
BOOTLO:
BOOTBG←←777000
PHASE BOOTBG
XBUF←←BOOTBG-4440
>;IFE DEBSW
>;IFE KLBOOT
>;IFE DSKDSW
IFN DEBSW,<
IFE DSKDSW,<
XBUF: BLOCK 4440
>;IFE DSKDSW
>;IFN DEBSW
IFN KLBOOT,<
IFE DEBSW,<
BOOTBG←←777000 ;CHANGE TO 777000 WHEN SOME MEMORY IS UP THERE
LOC 140
BOOTBG
FF
LOWEST
LOC 274
PHASE BOOTBG
XBUF←←BOOTBG-4440
>;IFE DEBSW
>;KLBOOT
;PETIT CHANNEL DEFINITIONS
IFN OLDDSK,<
;PMP CONI BITS
;LEFT HALF
CHLNXM←←200000 ;CHANNEL NXM
SELERR←←40000 ;SELECT ERROR
;37700 ARE ADDRESS OF CURRENTLY SELECTED DEVICE
DSKPAR←←40 ;CONTROL UNIT DETECTED PARITY ERROR (BIT 18 ALSO SET)
CORPAR←←20 ;CHANNEL DETECTED PARITY ERROR (BIT 18 ALSO SET)
IDLEL←←10 ;CHANNEL IS IDLE
IS←←4 ;CHANNEL IS IN INITIAL SELECT STATE
REQ←←2 ;CHANNEL IS IN REQUEST STATE
TRANS←←1 ;CHANNEL IS IN TRANSFER STATE
;RIGHT HALF
PARERR←←400000 ;CHANNEL OR CONTROL UNIT DETECTED PARITY ERROR
CMDEMP←←200000 ;COMMAND HOLD EMPTY (OR UNUSUAL END)
IDLE←←100000 ;IDLE STATE (SAME AS IDLEL)
UNEND←←40000 ;UNUSUAL END (NXM,SELERR,BUSY,UNIT CHECK,DATA CHAIN ERR)
NEWST←←20000 ;CHANNEL HAS NEW STATUS
ATTN←←10000 ;ATTENTION
STMOD←←4000 ;STATUS MODIFIER
CUEND←←2000 ;CONTROL UNIT END
BUSY←←1000 ;DEVICE BUSY (IF STMOD THEN CU BUSY)
CHNEND←←400 ;CHANNEL END
DEVEND←←200 ;DEVICE END
UCHK←←100 ;UNIT CHECK
UNXCPT←←40 ;UNIT EXCEPTION
ACTIVE←←20 ;CHANNEL IS REQUESTING AN INTERRUPT
;PMP CONO BITS (ENABLE INTERRUPT CONDITIONS)
EPAR←←400000 ;DISK OR CORE PARITY ERROR
ECMDEM←←200000 ;COMMAND HOLD EMPTY
EIDLE←←100000 ;IDLE
EUNEND←←40000 ;UNUSUAL END
ENEWST←←20000 ;NEW STATUS
EATTN←←10000 ;ATTENTION
ESTMOD←←4000 ;STATUS MODIFIER
ECUEND←←2000 ;CONTROL UNIT END
EBUSY←←1000 ;BUSY
ECHEND←←400 ;CHANNEL END
EDEVEN←←200 ;DEVICE END
EUCHK←←100 ;UNIT CHECK
EUNXCP←←40 ;UNIT EXCEPTION
;DATAO PMP,WCMA
;DATAI IBM,MA
;IBM CONO BITS (FOR CLEARING AND RESETTING THE CHANNEL)
CUNEND←←4000 ;CLEAR UNUSUAL END
CACTIV←←400 ;CLEAR ACTIVE
CNEWST←←200 ;CLEAR NEW STATUS
CSTATU←←40 ;CLEAR STATUS REGISTER
CCMDHO←←20 ;CLEAR COMMAND HOLD LOADED
SCMDHO←←10 ;SET COMMAND HOLD LOADED
RSTOPL←←2 ;RESET OPL OUT
RSTCHN←←1 ;RESET CHANNEL
;IBM DATAO BITS (SETS COMMAND HOLD LOADED AND LOADS COMMAND HOLD)
;17,,740000 ARE THE DEVICE ADDRESS
NWCMA←←20000 ;THIS COMMAND NEEDS A WCMA (DOES A MEMORY XFER)
BYTE4←←10000 ;4 BYTE MODE
CBYTES←←4000 ;COUNT BYTES
CHAIN←←2000 ;COMMAND CHAINING
SKMON←←1000 ;SKIP IF STATUS MOD ON
SKMOFF←←400 ;SKIP IF STATUS MOD OFF
;377 ARE THE COMMAND
RCMD←←6 ;READ COMMAND
WCMD←←5 ;WRITE COMMAND
>;IFN OLDDSK
;C1 CHANNEL DEFINITIONS
IFN NEWDSK,<
;CONO C1A BITS
C1SBI←←400000 ;SELECT BUS INTERFACE
C1RSI←←40000 ;RESET INTERFACE
C1SRUN←←10000 ;SET CLOCK RUN
C1CONT←←2000 ;CONTINUE CLOCK
C1SCH←←200000 ;SELECT CHANNEL
C1RST←←40000 ;RESET CHANNEL
C1CCIF←←20000 ;CLEAR CHANNEL INTERRUPT FLAG
C1INTE←←10000 ;INTERRUPT ENABLE
C1INTD←←4000 ;INTERRUPT DISABLE
C1SCF1←←2000 ;SET CF1
C1CCF1←←1000 ;CLEAR CF1
C1MPCN←←400 ;CONTINUE MICROPROCESSOR
C1LCD←←20 ;LOAD CODE FROM BITS 32-35
;BITS 32-35 ARE A CODE, BIT 32 IS OFF FOR "SOFTWARE" CODES:
C1LPT←←11 ;LOAD PROGRAM TABLE STARTING ADDRESS
C1SYSR←←2 ;SYSTEM RESET
C1SCAN←←7 ;SCAN PROGRAM TABLE FOR PROGRAMS TO START
C1SDIA←←100000 ;SELECT DIAGNOSTIC FUNCTIONS
;CONI C1A BITS
CIF←←4 ;CHANNEL INTERRUPT FLAG
CF1←←2 ;CHANNEL FLAG 1 (INTERRUPT THE Z80, SET FROM ICH IN CONO)
CF2←←1 ;CHANNEL FLAG 2 (Z80 READY FOR PROGRAM TABLE ADDRESS)
C1UCHK←←2 ;UNIT CHECK IN IBM STATUS BYTE
>;IFN NEWDSK
;C1 CHANNEL DATA AREA PARAMETERS
IFN NEWDSK,<
;CHANNEL PROGRAM DEFINITIONS
;LEFT HALF BITS
C1CMD←←100000 ;BITS 0-3 = 10 MEANS (NON-MRT) COMMAND WORD
C1MRT←←040000 ;BITS 0-3 = 04 MEANS MRT COMMAND WORD
C1JMP←←200000 ;BITS 0-3 = 20 MEANS JUMP COMMAND WORD
C1TIO←←020000 ;TEST I/O
C1IWC←←010000 ;IGNORE WORD COUNT
C1BAK←←004000 ;BACKWARDS
C1NATM←←000000 ;NATURAL MODE (MODE IN BITS 7-8)
C1BYTM←←001000 ;BYTE MODE
C1CBYT←←000400 ;COUNT BYTES
;BITS 10-17 ARE THE IBM COMMAND BYTE
;RIGHT HALF BITS
C1SLE←←20 ;STOP ON LENGTH ERROR
C1CEC←←10 ;CHANNEL END CONTINUE
C1NOC←←2 ;NO CHAINING
C1RPT←←1 ;REPEAT UNTIL STATUS MODIFIER IS ON IN ENDING STATUS
;PROGRAM TABLE
C1CCW←←0 ;RELATIVE ADDRESS OF CHANNEL CONTROL WORD
C1ISW←←1 ;INTERRUPT SOURCE WORD
C1PTPE←←100000 ;PARITY ERROR IN PROGRAM TABLE
C1PTNX←←40000 ;NXM IN PROGRAM TABLE
C1IQF←←20000 ;INTERRUPT QUEUE FULL
C1PPTR←←2 ;FIRST PROGRAM POINTER
;PROGRAM HEADER AND PROGRAM
C1PCW←←0 ;RELATIVE ADDRESS OF PROGRAM CONTROL WORD
C1BW←←100 ;BUSY WAIT BIT IN PCW
C1STA←←1 ;STATUS A
;RIGHT HALF BITS
C1HLT←←400000 ;PROGRAM EXECUTED A HALT
C1LE←←200000 ;LENGTH ERROR
C1SE←←100000 ;SELECT ERROR
C1PE←←040000 ;PARITY ERROR
C1NXM←←020000 ;NXM
C1BPE←←010000 ;IBM BUS PARITY ERROR
C1SSE←←002000 ;SIGNAL SEQUENCE ERROR
;LEFT HALF BITS
C1PCMA←←100000 ;1→ERROR POINTER TO BY PC, 0→POINTED TO BY MA
C1STB←←2 ;STATUS B
C1STC←←3 ;STATUS C
C1INST←←4 ;FIRST INSTRUCTION OF CHANNEL PROGRAM
>;IFN NEWDSK
;FILE SYSTEM PARAMETERS
MFDLOC←←1 ;TRACK CONTAINING MFD
TRKCYL←←=19 ;19 HEADS PER CYLINDER
CYLPK←←=815 ;815 CYLINDERS PER PACK
TRKPK←←TRKCYL*CYLPK ;19*815=15485 TRACKS PER PACK
;RETRIEVAL INFORMATION
NXTQQQ←←0
DEFINE ZWD (A) <
A←←NXTQQQ
NXTQQQ←←NXTQQQ+1
>
ZWD DDNAM ;FILE NAME
ZWD DDEXT ;FILE EXTENSION,,DATE WRITTEN,CREATION DATE
ZWD DDPRO ;PROTECTION,MODE,TIME,DATE WRITTEN
ZWD DDPPN ;PPN
ZWD DDLOC ;FIRST DISK ADDRESS OF THIS FILE
ZWD DDLNG ;LENGTH OF FILE IN WORDS
ZWD DREFTM
ZWD DDMPTM
ZWD DGRP1R ;FIRST USER RCRD NO. THIS GRP
ZWD DNXTGP ;BLOCK NUMBER OF NEXT GROUP
ZWD DSATID
ZWD DQINFO ;START OF SPECIAL STORAGE FOR LOGIN ETC.
NXTQQQ←←NXTQQQ+3
ZWD DOFFST ;RECORD OFFSET
ZWD DPTR ;RETRIEVAL DATA, 2 BLK NO.'S/WORD
;DSKDMP.DMP FORMAT
COMMENT ⊗
DSKDMP.DMP[SS,SYS] IS AN ORDINARY DUMP FILE EXCEPT THAT IT HAS BEEN
ASSEMBLED WITH A PHASE STATEMENT AND EXPECTS TO BE LOADED HIGH IN
THE FIRST 256K OF CORE. LOCATION 140 OF THE CORE IMAGE THAT WOULD
HAVE BEEN OBTAINED BY LOADING DSKDMP CONTAINS THE STARTING ADDRESS
FOR LOADING. LOCATION 274 IS THE FIRST WORD THAT SHOULD BE LOADED
THERE. LOCATION 141 CONTAINS THE RELOCATED FIRST FREE ADDRESS, 142
CONTAINS THE RELOCATED LOWEST ADDRESS. THESE TWO LOCATIONS ARE USED
ONLY BY THE CNVRT PROGRAM TO MAKE DSKDMP.D10
⊗
;BOOT BEGINS HERE
IFE DSKDSW,<
LOWEST←←.
BOOT: CONO APR,200000 ;RESET
SETZM KASIM
BLKI APR,A ;GET UCODE OPTIONS INTO BITS 0-8 OF A
TLNE A,100000 ;SKIP UNLESS KA SIMULATION UCODE LOADED
SETOM KASIM
MOVE P,[-LPDL,,PDL-1]
PUSHJ P,BLAST ;RESET THE CHANNEL
IFN DSKDBG,<
SKIPE N,SYSLOC
JRST BOOT1
>;DSKDBG
MOVEI N,MFDLOC
MOVE A,[SIXBIT / SSSYS/]
PUSHJ P,SRCH ;LOOK FOR _SSSYS.UFD IN MFD
JRST NOSYS
MOVE N,3(TT) ;GET ADDRESS
IFN DSKDBG,<
MOVEM N,SYSLOC
>;DSKDBG
BOOT1: MOVE A,[SIXBIT /DSKDMP/]
MOVSI B,'DMP'
PUSHJ P,SRCH1 ;LOOK FOR DSKDMP.DMP[SS,SYS]
JRST NODSKD
MOVE N,3(TT) ;GET DISK ADDRESS OF DSKDMP.DMP[SS,SYS]
MOVE T,[-240,,XBUF]
SETZM RECORD
PUSHJ P,READ0 ;READ RETRIEVAL AND ONE RECORD
MOVE A,XBUF+40+140-74 ;GET LOC 140 OF THE DUMP FILE
MOVE B,XBUF+DDLNG ;GET LENGTH OF DUMP FILE
IFN DSKDBG,<
MOVE C,XBUF+40+JOBSYM↑-74 ;GET POINTER TO SYMBOL TABLE
ADDI C,-274(A) ;RELOCATE IT
MOVEM C,SYMPNT
>;DSKDBG
MOVE C,XBUF+40+JOBSA↑-74 ;GET STARTING ADDRESS
HRRZM C,STARTA
SUBI B,200
MOVEM B,LODCNT ;LENGTH OF REMAINDER OF DUMP FILE
MOVEM A,LODNXT ;STORE ADDRESS TO LOAD INTO
MOVEI B,2
MOVEM B,RECORD ;START AT RECORD 2
MOVE C,[POINT 18,XBUF+DPTR]
MOVEM C,NXTTRK
MOVE T,LODCNT
CAILE T,4400-200
MOVEI T,4400-200
JRST BOOTL2
BOOTL1: MOVE T,LODCNT
MOVEI N,1
MOVEM N,RECORD
BOOTL2: ILDB N,NXTTRK
CAILE T,4400
MOVEI T,4400
MOVEM T,XFRCNT ;SAVE NUMBER OF WORDS THIS TRANSFER
MOVN T,T ;-NUMBER OF WORDS TO TRANSFER
HRLZ T,T
HRR T,LODNXT ;RH GETS NEXT LOC TO LOAD INTO
PUSHJ P,READ0 ;READ REST OF THIS TRACK
MOVE A,XFRCNT
ADDM A,LODNXT
MOVN A,A
ADDB A,LODCNT
IFN DSKDBG,<
JUMPLE A,BOOTL3 ;ALL DONE
>;DSKDBG
IFE DSKDBG,<
JUMPLE A,@STARTA ;DONE, TRANSFER TO DSKDMP
>;IFE DSKDBG
MOVE A,NXTTRK
CAME A,[POINT 18,XBUF+DPTR+17,35] ;JUST DID LAST TRACK IN GROUP?
JRST BOOTL1 ;NO, DO NEXT TRACK
MOVE N,XBUF+DNXTGP ;FIRST TRACK OF NEXT GROUP
PUSHJ P,RDRET ;READ RETRIEVAL
MOVE A,[POINT 18,XBUF+DPTR]
MOVEM A,NXTTRK
JRST BOOTL1
IFN DSKDBG,<
BOOTL3: SETOM 37
MOVE A,SYMPNT
MOVEM A,36
JRST @STARTA ;JUMP TO STARTING ADDRESS
>;DSKDBG
NODSKD: SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.DMP[SS,SYS]/]]
NOSYS: MOVEI B,[ASCIZ /CAN'T FIND SSSYS.UFD[1,1]/]
PUSHJ P,TYPE
JRST 4,.
>;IFE DSKDSW
;DSKDMP BEGINS HERE
IFN DSKDSW,<
LOWEST←←.
DSKDMP: MOVE P,[-LPDL,,PDL-1]
CONO APR,200000
CONO PI,10000
SKPKL
JRST DSKDM1
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
CONSO KLPAG,600000 ;IS THE CACHE ON ALREADY?
JRST DSKDM0 ;NO.
BLKO CCA, ;VALIDATE CORE
CONSZ APR,SWEEPB
JRST .-1
DSKDM0: CONO KLPAG,0 ;TURN OFF CACHE. EPT TO PAGE ZERO. TURN OFF MAP
DATAI CCA,0 ;SWEEP CACHE. INVALIDATE ALL.
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
BLKI APR,A ;GET UCODE OPTIONS INTO BITS 0-8 OF A
TLNN A,100000 ;SKIP IF KA SIMULATION UCODE LOADED
JRST DSKDM1
SETOM KASIM
CONO KLPAG,0 ;MAKE SURE EPT IS AT ZERO
MOVEI C,411
PUSHJ P,DTEXX ;TELL KLDCP TO ENTER KASIM MODE
CONO KLPAG,1000 ;MOVE EPT TO PAGE 1000
PUSHJ P,BLAST
JRST DSKDM2
DSKDM1: PUSHJ P,BLAST
SETZM KASIM
SKPKL
CONO TTY,3600 ;CLEAR ALL BUSY AND DONE FLAGS
SKIPN KASIM
SKIPA B,[SIXBIT / SSYS/]
DSKDM2: MOVE B,[SIXBIT / DSYS/];DIAGNOSTICS LIVE HERE
MOVEM B,DEFPPN
MOVEI F,0
MOVEI B,[ASCIZ /DSKDMP/]
PUSHJ P,TYPE
SKIPN KASIM
JRST DSKDL
MOVEI B,[ASCIZ /
KA SIMULATION MICROCODE LOADED
SWITCHES = /]
PUSHJ P,TYPE
DATAI APR,B
PUSHJ P,OCTTYP
DSKDL: MOVEI B,[ASCIZ /
*/]
PUSHJ P,TYPE
TRZ F,RBO
MOVEI B,0
DSKDL2: MOVE A,[010700,,TIBUF-1]
SETZM TIBUF
MOVE C,[TIBUF,,TIBUF+1]
BLT C,TIBUF+TIBFLN-1
DSKDL1: PUSHJ P,TYI ;GET CHARACTER IN C
CAIN C,177
JRST DSKDRO ;RUBOUT
TRZE F,RBO
JRST [ PUSH P,C
MOVEI C,"\"
PUSHJ P,TYO
POP P,C
PUSHJ P,TYO
CAIE C,15
JRST .+1
MOVEI C,12
PUSHJ P,TYO
MOVEI C,15
JRST .+1 ]
CAIN C,15
JRST DSKDGO
CAIN C,33
JRST DSKDAL ;ALT MODE
CAIN C,"U"-100
JRST DSKDL
IDPB C,A
JRST DSKDL1
DSKDRO: CAMN A,[010700,,TIBUF-1]
JRST DSKDL
MOVEI C,"\"
TRON F,RBO ;SET RUBOUT FLAG, SKIP IF ALREADY ON
PUSHJ P,TYO
LDB C,A
PUSHJ P,TYO
MOVEI C,0
DPB C,A
ADD A,[070000,,]
JUMPGE A,DSKDL1
SUB A,[430000,,1]
JRST DSKDL1
DSKDAL: LDB A,[POINT 7,TIBUF,6] ;GET FIRST CHARACTER
CAIL A,"0"
CAILE A,"9"
CAIA
JRST SSTRTA ;SET STARTING ADDRESS
MOVE A,TIBUF
MOVSI B,-NCMDS
DSKAL1: CAME A,CMDS(B)
AOBJN B,DSKAL1
JUMPL B,DSKDL2 ;JUMP IF FOUND ONE (B REMEMBERS THE COMMAND)
PUSHJ P,QQQ
JRST DSKDL
QQQ: MOVEI B,[ASCIZ / ???/]
JRST TYPE
DSKDGO: JUMPE B,LOADGO ;JUST FILE NAME
JRST @CMDDSP(B) ;DISPATCH ON COMMAND
CMDS: ASCII /L/ ;LOAD
ASCII /F/ ;LIST FILES
ASCII /D/ ;DUMP
ASCII /K/ ;KILL A FILE
ASCII /G/ ;START AT STARTING ADDRESS
ASCII /M/ ;MERGE (LOAD WITHOUT CLEAR)
ASCII /N/ ;LIKE L BUT DOESN'T HACK LOW CORE CELLS
NCMDS←←.-CMDS
CMDDSP: LOAD
FILES
DUMP
KILL
START
MERGE
NOMUCK
SSTRTA: MOVE A,[POINT 7,TIBUF]
MOVEI B,0
SSTRT1: ILDB C,A
CAIL C,"0"
CAILE C,"9"
JRST SSTRT2
LSH B,3
ADDI B,-"0"(C)
JRST SSTRT1
SSTRT2: MOVEM B,STARTA
JRST DSKDL
START: PUSHJ P,TWAIT ;WAIT FOR TTY TO FINISH
SKIPE STARTA
JRST @STARTA
MOVEI B,[ASCIZ /NO STARTING ADDRESS/]
PUSHJ P,TYPE
JRST DSKDL
LOADGO: SETOM ZERFLG
SETOM MUCKFL
PUSHJ P,LOADIT
JRST DSKDL ;COULDN'T DO IT
MOVEI B,[ASCIZ / LOADED/]
PUSHJ P,TYPE
PUSHJ P,TWAIT
SKIPE STARTA
JRST @STARTA ;START IT UP
MOVEI B,[ASCIZ / BUT NO STARTING ADDRESS/]
PUSHJ P,TYPE
JRST DSKDL
NOMUCK: SETOM ZERFLG
SETZM MUCKFL
JRST LOADN
MERGE: SETZM ZERFLG
SETOM MUCKFL
JRST LOADN
LOAD: SETOM ZERFLG
SETOM MUCKFL
LOADN: PUSHJ P,LOADIT
JRST DSKDL ;COULDN'T DO IT
MOVEI B,[ASCIZ / LOADED/]
PUSHJ P,TYPE
JRST DSKDL
;SKIP RETURNS IF SUCCESSFUL
LOADIT: PUSHJ P,FILSET ;SET UP FILE NAME
SKIPN FNAM
JRST QQQ
MOVE A,FPPN
MOVEM A,DEFPPN
MOVEI N,MFDLOC
PUSHJ P,SRCH
JRST NSA ;UFD NOT FOUND IN MFD
MOVE N,3(TT) ;DISK ADDRESS OF UFD
MOVE A,FNAM
HLLZ B,FEXT
PUSHJ P,SRCH1
JRST FNF ;FILE NOT FOUND IN UFD
MOVE N,3(TT) ;DISK ADDRESS OF FILE
SKIPN ZERFLG
JRST LDIT0
SETZM 40
MOVE A,[40,,41]
BLT A,DSKDMP-1 ;CLEAR CORE UP TO DSKDMP
LDIT0: MOVE T,[-240,,XBUF]
SETZM RECORD
PUSHJ P,READ0 ;READ RETRIEVAL AND ONE RECORD
SETZB C,FHILOC
SETZM STARTA
SKIPN MUCKFL ;SKIP IF MUCKING WITH LOW CORE CELLS
JRST LDIT0A
MOVE C,XBUF+40+JOBSYM↑-74 ;GET POINTER TO SYMBOL TABLE
MOVEM C,SYMPNT ;SAVE FOR LATER
MOVE C,XBUF+40+JOBSA↑-74 ;GET STARTING ADDRESS
HRRZM C,STARTA
MOVE C,XBUF+40+HILOC↑-74 ;ADDRESS OF BEGINNING OF UPPER
MOVEM C,FHILOC
LDIT0A: MOVE B,XBUF+DDLNG ;GET LENGTH OF DUMP FILE
JUMPE C,LDIT1 ;NO UPPER
MOVEI B,-74(C) ;FILE SIZE OF LOWER
SUBI C,1
IORI C,1777 ;LAST ADDRESS OF LOWER
CAIGE C,377777
MOVEI C,377777
ADDI C,1
MOVEM C,UPPRST ;UPPER STARTS HERE
LDIT1: MOVEM B,LODCNT
MOVEI A,74
MOVEM A,LODNXT ;STORE ADDRESS TO LOAD INTO
PUSHJ P,LDLP ;LOAD THE LOWER
SKIPN C,FHILOC ;SKIP IF THERE IS AN UPPER
JRST LDIT2 ;NO UPPER
MOVE B,XBUF+DDLNG
SUBI B,-74(C) ;COMPUTE SIZE OF UPPER
MOVEM B,LODCNT
MOVE B,UPPRST
MOVEM B,LODNXT ;STARTING CORE ADDRESS OF UPPER
MOVE A,RECORD ;NEXT RECORD TO READ IS FIRST REC OF UPPER
CAIN A,=19
JRST LDIT3 ;UPPER BEGINS ON A TRACK BOUNDARY
MOVN T,A
ADDI T,=19 ;NUMBER OF RECORDS LEFT IN TRACK
IMULI T,200 ;NUMBER OF WORDS LEFT IN TRACK
CAMLE T,LODCNT
MOVE T,LODCNT
LDB N,NXTTRK
PUSHJ P,LDLP3
JRST LDIT2
LDIT3: MOVE A,NXTTRK
CAME A,[POINT 18,XBUF+DPTR+17,35]
JRST LDIT4
MOVE N,XBUF+DNXTGP
PUSHJ P,RDRET ;READ RETRIEVAL OF NEXT GROUP
MOVE A,[POINT 18,XBUF+DPTR]
MOVEM A,NXTTRK
LDIT4: PUSHJ P,LDLP1 ;LOAD THE UPPER
LDIT2: MOVEI A,-1
MOVEM A,37
MOVE A,SYMPNT
SKIPE KASIM
MOVEI A,116 ;PDP-6 DDT EXPECTS 36 TO POINT TO SYM PTR
MOVEM A,36
JRST CPOPJ1
;SET LODNXT TO FIRST LOCATION TO LOAD INTO, LODCNT TO NUMBER OF WORDS TO TRANSFER
;STARTS READING AT THE BEGINNING OF THE GROUP WHOSE RETRIEVAL IS IN XBUF
LDLP: MOVE C,[POINT 18,XBUF+DPTR]
MOVEM C,NXTTRK
LDLP1: MOVE T,LODCNT
MOVEI N,1
MOVEM N,RECORD
ILDB N,NXTTRK
LDLP3: CAILE T,4400
MOVEI T,4400
MOVEM T,XFRCNT ;SAVE NUMBER OF WORDS THIS TRANSFER
MOVN T,T ;-NUMBER OF WORDS TO TRANSFER
HRLZ T,T
HRR T,LODNXT ;RH GETS NEXT LOC TO LOAD INTO
PUSHJ P,READ0 ;READ THE TRACK
MOVE A,XFRCNT
ADDM A,LODNXT
MOVN A,A
ADDB A,LODCNT
JUMPLE A,CPOPJ ;DONE
MOVE A,NXTTRK
CAME A,[POINT 18,XBUF+DPTR+17,35] ;JUST DID LAST TRACK IN GROUP?
JRST LDLP1 ;NO, DO NEXT TRACK
MOVE N,XBUF+DNXTGP ;FIRST TRACK OF NEXT GROUP
PUSHJ P,RDRET ;READ RETRIEVAL
JRST LDLP
FILES: MOVEI B,[ASCIZ /FILES COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
DUMP: MOVEI B,[ASCIZ /DUMP COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
KILL: MOVEI B,[ASCIZ /KILL COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
NSA: MOVEI B,[ASCIZ /NO SUCH AREA - /]
PUSHJ P,TYPE
JRST PPNTYP
FNF: MOVEI B,[ASCIZ /NO SUCH FILE - /]
PUSHJ P,TYPE
JRST FILTYP
;FILSET
;SCAN TIBUF AND SET UP FILE NAME, EXTENSION AND PPN
FILSET: MOVE B,DEFPPN
MOVEM B,FPPN
MOVE B,DEFEXT
MOVEM B,FEXT
SETZM FNAM
SETZM FEXT+1
MOVE A,[010700,,TIBUF-1]
PUSHJ P,FILSIX
MOVEM B,FNAM
CAIE D,"."
JRST FILSE1
PUSHJ P,FILSIX
HLLZM B,FEXT
FILSE1: CAIE D,"["
POPJ P,
PUSHJ P,FILSIX
PUSHJ P,RADJ
HLLM B,FPPN
CAIE D,","
POPJ P,
PUSHJ P,FILSIX
PUSHJ P,RADJ
HLRM B,FPPN
POPJ P,
FILSIX: MOVEI B,0
MOVE C,[440600,,B]
FILSI1: ILDB D,A ;GET NEXT CHARACTER FROM BUFFER
CAIE D,"."
CAIN D,"["
POPJ P,
CAIE D,","
CAIN D,"]"
POPJ P,
JUMPE D,CPOPJ
SUBI D,40
TLNE C,770000
IDPB D,C
JRST FILSI1
RADJ: JUMPE B,CPOPJ
RADJ1: TLNE B,77
POPJ P,
LSH B,-6
JRST RADJ1
>;DSKDSW
;SUBROUTINES TO RUN THE DISK SEEK,XWAIT,SETUP,DSKERR
IFN OLDDSK,<
SEEK: MOVEI TT,10
MOVEM TT,ERRCNT
SEEK1: DATAO PMP,SKWCMA
DATAO IBM,SKCMD
SEEK2: CONSO PMP,NEWST!UNEND
JRST .-1
CONI PMP,T
CONO IBM,CNEWST!CUNEND ;OK TO DO THIS HERE SINCE SEEK IS NOT CHAINED
TRC T,STMOD!UCHK
TRCN T,STMOD!UCHK
JRST SKRTRY ;RETRY SEEK
TRNE T,UNEND
JRST SKERR ;SEEK ERROR
TRNN T,DEVEND
JRST SEEK2 ;SPLIT CHN/DEV END, WAIT FOR DEVICE END
POPJ P,
SKERR: PUSHJ P,DSKERR ;GET SENSE DATA OUT OF THE WAY IF IT'S A UNIT CHECK
SOSL ERRCNT
JRST SEEK1
MOVEI B,[ASCIZ /CAN'T SEEK/]
PUSHJ P,TYPE
JRST 4,.
SKRTRY: PUSHJ P,XWAIT1 ;WAIT FOR DEVICE END
JRST SEEK1
;GET HERE AFTER DETECTING UNEND. STATUS IS IN T
DSKERR: TRNN T,UCHK
JRST BLAST ;UNUSUAL END OTHER THAN UNIT CHECK
DSKER1: TRNN T,DEVEND
PUSHJ P,WDEV ;WAIT FOR DEVICE END
DATAO PMP,SNSWC
DATAO IBM,SNSCMD
CONSO PMP,NEWST
JRST .-1
CONI PMP,T
CONO IBM,CUNEND!CNEWST
TRNN T,DEVEND
JRST BLAST
POPJ P,
WDEV: CONSO PMP,NEWST
JRST .-1
CONI PMP,T
CONO IBM,CUNEND!CNEWST
TRNN T,DEVEND
JRST WDEV
POPJ P,
XWAIT: CONSO PMP,NEWST!UNEND
JRST .-1
CONI PMP,T
XWAIT1: TRC T,STMOD!UCHK
TRCN T,STMOD!UCHK
JRST XWRTRY
TRNE T,UNEND
JRST XWERR ;PROBABLY GOT UNIT CHECK
CONO IBM,CNEWST!CUNEND
TRNN T,DEVEND
JRST XWAIT
POPJ P,
XWRTRY: CONO IBM,CCMDHO!CNEWST!CUNEND ;FLUSH EVERYTHING
XWRTY2: TRNN T,DEVEND
PUSHJ P,WDEV
HLRZ T,RETRYS
XCT XWRTB1(T) ;DATAO PMP,...
XCT XWRTB2(T) ;DATAO IBM,...
CONSO PMP,CMDEMP
JRST .-1
HRRZ T,RETRYS
XCT XWRTB1(T)
XCT XWRTB2(T)
JRST XWAIT
XWRTB1: DATAO PMP,SCWCMA
DATAO PMP,RXWCMA
JFCL
XWRTB2: DATAO IBM,SCCMD
DATAO IBM,XCMD
DATAO IBM,NOPCMD
XWERR: SKIPE BCHAIN ;SKIP IF NOT AT START OF COMMAND CHAIN
TRNN T,UCHK
JRST XWERR1
CONO IBM,CCMDHO!CNEWST!CUNEND
PUSHJ P,DSKER1
TRZ T,STMOD ;MAKE IT LOOK LIKE A FAILING SEARCH
POPJ P,
XWERR1: MOVEI B,[ASCIZ /UNEND AT XWAIT/]
PUSHJ P,TYPE
JRST 4,.
SETUP: SETZM SKDAT
SETZM SKDAT+1
SETZM SCDAT
SETZM SCDAT+1
IDIVI N,TRKPK ;N←PACK, T←TRACK ON PACK
IORI N,CUADR⊗4 ;DISK DRIVE ADDRESS
DPB N,ADR1
DPB N,ADR2
DPB N,ADR3
DPB N,ADR4
DPB N,ADR5
IDIVI T,TRKCYL ;T←CYLINDER, TT←HEAD
DPB T,CYL1
DPB T,CYL2
DPB TT,HEAD1
DPB TT,HEAD2
POPJ P,
>;IFN OLDDSK
;SRCH, RDRET, READ, BLAST
;SRCH IS GIVEN A FILENAME IN A AND A TRACK IN N.
;SRCH1 IS GIVEN A FILENAME IN A, AN EXTENSION IN B AND A TRACK IN N
SRCH: MOVSI B,'UFD'
SRCH1: PUSHJ P,READ ;READ TRACK N INTO XBUF
SKIPN T,DDLNG+XBUF ;GET FILE LENGTH
POPJ P,
MOVE TT,[POINT 18,DPTR+XBUF,17]
MOVEM TT,NXTTRK
SRCH2: MOVE TT,[-4400,,XBUF+40]
SRCH3: HLLZ C,1(TT)
CAMN A,(TT)
CAME B,C
JRST SRCHLP
JRST CPOPJ1 ;RETURN WITH POINTER IN TT
SRCHLP: SUBI T,NUFDWD
JUMPLE T,CPOPJ ;NOT FOUND
ADD TT,[NUFDWD-1,,NUFDWD-1]
AOBJN TT,SRCH3
MOVE TT,NXTTRK
CAMN TT,[POINT 18,DPTR+XBUF+17,35] ;LAST TRACK IN GROUP?
JRST SRCH4 ;YES
ILDB N,NXTTRK
SRCH5: PUSH P,T ;SAVE COUNT OF WORDS LEFT TO SEARCH
PUSHJ P,READ ;READ IN THE NEXT TRACK
POP P,T
JRST SRCH2
SRCH4: MOVE N,DNXTGP+XBUF ;BLOCK NUMBER OF FIRST TRACK NEXT GROUP
MOVE TT,[POINT 18,DPTR+XBUF,17]
MOVEM TT,NXTTRK
JRST SRCH5
;RDRET READS RETRIEVAL OF TRACK WHOSE ADDRESS IS IN N
;READ READS ENTIRE TRACK WHOSE ADDRESS IS IN N
RDRET: SKIPA T,[-40,,XBUF]
READ: MOVE T,[-4440,,XBUF] ;ADDRESS OF BUFFER
SETZM RECORD ;START READING AT RECORD ZERO
READ0:
IFN NEWDSK,<
JRST READC1
>;IFN NEWDSK
IFN OLDDSK,<
MOVEM T,XWCMA
MOVEM T,RXWCMA ;RETRY XWCMA
PUSHJ P,SETUP
MOVE T,RECORD ;GET RECORD NUMBER TO READ FIRST
DPB T,REC1
MOVEI T,RCMD
DPB T,CMD1 ;SET COMMAND TO "READ"
PUSHJ P,SEEK
SETOM BCHAIN ;INDICATE START OF COMMAND CHAIN
READ1: DATAO PMP,SCWCMA
DATAO IBM,SCCMD
CONSO PMP,CMDEMP
JRST .-1
DATAO PMP,XWCMA
DATAO IBM,XCMD
MOVEI T,1 ;0,,1
MOVEM T,RETRYS ;SET RETRY STATUS TO SEACH,,READ
PUSHJ P,XWAIT ;WAIT FOR DEVEND, GET STATUS IN T
SETZM BCHAIN ;NOT A BEGINNING OF COMMAND CHAIN ANYMORE
TRNN T,STMOD
JRST READ1 ;SEARCH FAILED, CHAIN TO SEARCH AGAIN
READ2: AOS T,RECORD
MOVE T,RCLTAB-1(T) ;GET SIZE OF RECORD IN BOTH HALVES
ADDB T,XWCMA
JUMPGE T,READDN ;JUMP IF NO MORE TO READ
DATAO PMP,XWCMA
DATAO IBM,XCMD
MOVE T,[1,,1] ;SET RETRY STATUS TO READ,,READ
MOVEM T,RETRYS
PUSHJ P,XWAIT
MOVE T,XWCMA
MOVEM T,RXWCMA
JRST READ2
READDN: DATAO IBM,NOPCMD ;ISSUE NOP COMMAND TO TERMINATE CHAINING
MOVE T,[1,,2] ;READ,,NOP
MOVEM T,RETRYS
PUSHJ P,XWAIT ;WAIT FOR LAST TRANSFER COMMAND TO FINISH
MOVE T,[2,,2]
MOVEM T,RETRYS ;NOP,,NOP IN CASE OF RETRY
JRST XWAIT ;WAIT FOR NOP TO FINISH AND RETURN
>;IFN OLDDSK
IFN NEWDSK,<
READC1: PUSHJ P,C1MPIL ;HERE WITH WCMA IN T, COMPILE INTO MRT INST
PUSH P,T ;SAVE RECORD NUMBER RETURNED BY C1MPIL
SETZM C1ERR ;CLEAR ERROR COUNT
IDIVI N,TRKPK ;N←PACK, T←TRACK ON PACK
IDIVI T,TRKCYL ;T←CYLINDER, TT←HEAD
DPB T,[POINT 16,C1CCHR,15] ;C C
DPB TT,[POINT 8,C1CCHR,23] ;H
MOVE TT,RECORD
POP P,RECORD
DPB TT,[POINT 8,C1CCHR,31] ;R
MOVE TT,C1WCHN(N) ;GET CHANNEL NUMBER
DPB N,[POINT 4,@C1PPTP(TT),12] ;STORE DISK DRIVE ADDRESS
MOVEI N,4
DPB N,[POINT 5,@C1PPTP(TT),4] ;STORE START CODE
C1WAIT: JUMPN TT,C1WAIB
CONSO C1A,CIF
JRST .-1
MOVEI T,0
EXCH T,C1APT+C1ISW
C1WAIA: TLC T,200000
TLNE T,600000
JRST C1WERR
MOVE T,C1PH+C1STA ;STATUS A WORD
TRNN T,C1HLT
JRST C1WERR
XCT C1CIFI(TT) ;CLEAR INT FLAG
POPJ P,
C1WAIB: CONSO C1B,CIF
JRST .-1
MOVEI T,0
EXCH T,C1BPT+C1ISW
JRST C1WAIA
C1WERR: AOS T,C1ERR
CAIL T,=10
JRST C1DIE
PUSHJ P,BLAST
MOVEI T,4
DPB T,[POINT 5,@C1PPTP(TT),4] ;START C1 AGAIN
JRST C1WAIT
C1DIE: MOVEI B,[ASCIZ /C1 ERRORS
/]
PUSHJ P,TYPE
JRST 4,.
C1MPIL: PUSH P,A ;HERE WITH WCMA IN T, 1ST RECORD # IN RECORD
PUSH P,B
PUSH P,C
MOVE A,[-=21,,C1MRTD-1] ;PUSH DOWN POINTER FOR DATA POINTERS
MOVE B,RECORD
C1MPI1: HRLZ C,RCLTAB(B) ;GET SIZE OF RECORD
LSH C,4
HRR C,T
TLO C,600000 ;MARK AS DATA PNTR AND 1ST OF THE RECORD
PUSH A,C
ADD T,RCLTAB(B)
ADDI B,1 ;ADVANCE RECORD NUMBER
JUMPL T,C1MPI1
MOVE T,B ;RETURN NEXT RECORD NUMBER IN T
PUSH A,[0]
POP P,C
POP P,B
POP P,A
POPJ P,
C1SET: SETZM C1ZERO
MOVE A,[C1ZERO,,C1ZERO+1]
BLT A,C1ZEND-1
MOVEI A,253
MOVEM A,C1APT+C1CCW
MOVEM A,C1BPT+C1CCW
MOVEI A,C1BW ;BUSY WAIT BIT
MOVEM A,C1PH
MOVE A,[C1JMP,,C1MRTC]
MOVEM A,C1PH+C1INST
MOVE A,[<BYTE (5)37 (8)CUADR⊗4>!C1PH]
MOVEM A,C1APT+C1PPTR
MOVE A,[<BYTE (5)37 (8)<CUADR+1>⊗4>!C1PH]
MOVEM A,C1BPT+C1PPTR
POPJ P,
>;IFN NEWDSK
BLAST:
IFN NEWDSK,<
JRST RSTC1 ;RESET CHANNELS
>;IFN NEWDSK
IFN OLDDSK,<
CONO IBM,CUNEND!CACTIV!CNEWST!CSTATU!CCMDHO
MOVEI T,3
BLAST1: MOVEI TT,1000
CONO IBM,RSTCHN!RSTOPL
SOJG TT,.
SOJG T,BLAST1
POPJ P,
>;IFN OLDDSK
IFN NEWDSK,<
;RESET C1 CHANNELS
RSTC1: AOSN C1FRST
PUSHJ P,C1SET ;SET UP C1 DATA AREAS ONCE ONLY
CONO C1A,C1SBI!C1RSI!C1SRUN!C1CONT ;RESET ALL CHANNELS START CLOCK
CONO C1A,C1SCH!C1RST!C1MPCN ;RESET CHAN A AND START UP
CONO C1B,C1SCH!C1RST!C1MPCN ;RESET CHAN B AND START UP
CONO C1A,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1A TO DO A SYSTEM RESET
MOVEI A,100000
CONSZ C1A,CF1 ;WAIT FOR IT TO DROP CF1
SOJG A,.-1
CONO C1B,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1B TOO
MOVEI A,100000
CONSZ C1B,CF1
SOJG A,.-1
CONO C1A,C1SCH!C1SCF1!C1LCD!C1LPT ;INT THE CHANNEL FOR LD ...
CONO C1B,C1SCH!C1SCF1!C1LCD!C1LPT ;...PGM TABLE.
MOVEI A,100000
CONSO C1A,CF2 ;WAIT FOR CHANNEL TO BE READY FOR PGM TBL
SOJG A,.-1
DATAO C1A,C1PTP ;TELL IT WHERE THE PROGRAM TABLE IS
CONO C1A,C1SCH!C1CCF1 ;CLEAR CF1 (TELL IT WE'VE TOLD IT)
MOVEI A,100000
CONSZ C1A,CF2 ;WAIT FOR CHANNEL TO DROP CF2
SOJG A,.-1
MOVEI A,100000
CONSO C1B,CF2 ;REPEAT FOR SECOND CHANNEL
SOJG A,.-1
DATAO C1B,C1PTP+1
CONO C1B,C1SCH!C1CCF1
MOVEI A,100000
CONSZ C1B,CF2
SOJG A,.-1
POPJ P,
>;IFN NEWDSK
;TYPE, TYO, TYI, FILTYP, PPNTYP, TWAIT
TYPE: HRLI B,440700
TYPE1: ILDB C,B
JUMPE C,CPOPJ
PUSHJ P,TYO
JRST TYPE1
TYO: PUSH P,C
CAIN C,33
MOVEI C,"$"
SKPKA
SKIPE KASIM
CAIA
JRST KLTYO
CONSZ TTY,20
JRST .-1
DATAO TTY,C
POP P,C
POPJ P,
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
DTEXX: MOVEM C,DTCMD
SETZM DTFLG ;CLEAR 11'S RESPONSE FLAG
CONO DTE0,DONG11 ;RING FOR 11
SKIPN DTFLG ;WAIT FOR RESPONSE
JRST .-1
MOVE C,DTF11 ;GET 11'S RESPONSE WORD
POPJ P,
KLTYO: ANDI C,177
PUSHJ P,DTEXX
POP P,C
POPJ P,
IFN DSKDSW,<
KLTYI: MOVEI C,3400
PUSHJ P,DTEXX
JUMPE C,KLTYI
JRST KLTYI1
TYI: SKPKA
SKIPE KASIM
CAIA
JRST KLTYI
CONSO TTY,40
JRST .-1
DATAI TTY,C
KLTYI1: ANDI C,177 ;FLUSH PARITY BIT
CAIL C,"a"
CAILE C,"z"
CAIA
SUBI C,40
CAIE C,176
CAIN C,175
MOVEI C,33
CAIN C,12
MOVEI C,15
CAIN C,"U"-100
JRST TYICAN
TRNE F,RBO ;SKIP UNLESS RUBBING OUT
POPJ P, ;DON'T ECHO HERE IF RUBBING OUT
PUSH P,C
PUSHJ P,TYO
CAIE C,15
JRST POPCJ
MOVEI C,12
PUSHJ P,TYO
POPCJ: POP P,C
POPJ P,
TYICAN: MOVEI C,"↑"
PUSHJ P,TYO
MOVEI C,"U"
PUSHJ P,TYO
MOVEI C,"U"-100
TRZ F,RBO
POPJ P,
FILTYP: MOVE D,FNAM
PUSHJ P,TYPSIX
MOVEI C,"."
SKIPN D,FEXT
JRST PPNTYP
PUSHJ P,TYO
PUSHJ P,TYPSIX
PPNTYP: MOVEI C,"["
PUSHJ P,TYO
HLLZ D,FPPN
PUSHJ P,TYPSIX
MOVEI C,","
PUSHJ P,TYO
HRLZ D,FPPN
PUSHJ P,TYPSIX
MOVEI C,"]"
JRST TYO
TYPSIX: MOVEI C,0
LSHC C,6
JUMPE C,TYPSI1
ADDI C,40
PUSHJ P,TYO
TYPSI1: JUMPN D,TYPSIX
POPJ P,
TWAIT: SKPKA
SKIPE KASIM
CAIA
POPJ P,
CONSZ TTY,20
JRST TWAIT
POPJ P,
OCTTYP: IDIVI B,10
JUMPE B,OCTTY1
HRLM C,(P)
PUSHJ P,OCTTYP
HLRZ C,(P)
OCTTY1: ADDI C,"0"
JRST TYO
>;DSKDSW
;DISK ADDRESSES AND POINTERS
IFN OLDDSK,<
CYL1: POINT 16,SKDAT,31
CYL2: POINT 16,SCDAT,15
HEAD1: POINT 8,SKDAT+1,15
HEAD2: POINT 8,SCDAT,31
REC1: POINT 8,SCDAT+1,7
ADR1: POINT 8,SKCMD,21
ADR2: POINT 8,SCCMD,21
ADR3: POINT 8,XCMD,21
ADR4: POINT 8,NOPCMD,21
ADR5: POINT 8,SNSCMD,21
CMD1: POINT 8,XCMD,35
SKDAT: 0 ;0,0,C,C
0 ;0,H,0,0
SCDAT: 0 ;C,C,H,H
0 ;R,0,0,0
SKWCMA: SKDAT
SCWCMA: SCDAT
XWCMA: 0
SNSWC: SNSDAT
SKCMD: NWCMA!BYTE4!7
SCCMD: CHAIN!SKMOFF!NWCMA!BYTE4!61
XCMD: CHAIN!NWCMA!6 ;CHANGE TO 5 FOR WRITE
NOPCMD: 3
SNSCMD: NWCMA!CBYTES!BYTE4!4
RETRYS: 0 ;RETRY STATUS. RH = NEW COMMAND, LH = OLD
;0 → SEARCH, 1 → READ, 2 → NOP
RXWCMA: 0 ;PREVIOUS XWCMA FOR RETRY
BCHAIN: 0 ;-1 INDICATES BEGINNING OF COMMAND CHAIN
>;IFN OLDDSK
IFN NEWDSK,<
C1ZERO:: ;ZERO FROM HERE TO C1ZEND AT DISKUP
C1APT: BLOCK C1PPTR+1+1 ;CHN CTL WD, INT WD, PGM PTR, END MARK
C1BPT: BLOCK C1PPTR+1+1 ;PROGRAM TABLE FOR SECOND CHANNEL
C1PH: BLOCK C1INST ;PROGRAM HEADER
0 ;JUMP TO PROGRAM
C1ZEND::
C1FRST: -1 ;-1 FIRST TIME THROUGH
C1ERR: 0 ;ERROR COUNT
C1PTP: C1APT ;POINTERS TO PRG TABLES INDEXED BY CHANNEL NUMBER
C1BPT
C1PPTP: C1APT+C1PPTR
C1BPT+C1PPTR
C1CIFI: CONO C1A,C1SCH!C1CCIF ;INST TO CLEAR CIF INDEXED BY CHANNEL NUMBER
CONO C1B,C1SCH!C1CCIF
;WCMAS FOR CONTROL COMMANDS
DEFINE C1WCMA (COUNT,ADDR,REC)<
ZZZ←←0
IFIDN <REC><R><ZZZ←←1>
BYTE (1)1 (1)ZZZ (13)COUNT (22)ADDR
>
C1MRTC: C1MRT!C1NATM!6,,0 ;MRT READ COMMAND
C1CCHR: BYTE (8)0,0,0,0 ;C C H R
BYTE (8)0,=19-1,0,0 ;SECTOR, LAST REC, WRAP REC, 0
C1JMP,,C1MRTD ;JUMP TO 1ST DATA POINTER
C1MRTD: BLOCK =19
0
;TABLE OF WHICH DRIVE IS ON WHICH CHANNEL, 0 FOR C1A, 1 FOR C1B
C1WCHN: 0
1
0
1
0
1
IFN .-C1WCHN-NPACKS,<.FATAL GUESS WHAT YOU FORGOT TO CHANGE>
>;IFN NEWDSK
IFN OLDDSK,<
SNSDAT: BLOCK 6 ;24 BYTES OF SENSE INFO
>;IFN OLDDSK
RCLTAB: 40,,40
REPEAT =18,<
200,,200
>
IFN DSKDSW,<
XBUF: BLOCK 4440
>;DSKDSW
IFN DSKDSW,<
LPDL←←20
>;IFN DSKDSW
IFE DSKDSW,<
LPDL←←5
>;IFE DSKDSW
PDL: BLOCK LPDL
ERRCNT: 0
RECORD: 0
NXTTRK: 0 ;BYTE POINTER TO DPTR
SYMPNT: 0 ;SYMBOL TABLE POINTER FROM DSKDMP.DMP
IFN DSKDBG,<
SYSLOC: 0 ;DISK ADDRESS OF SSSYS.UFD[1,1]
PATCH: BLOCK 40
>;DSKDBG
LODCNT: 0 ;NUMBER OF WORDS IN FILE LEFT TO LOAD
LODNXT: 0 ;NEXT ADDRESS TO LOAD INTO
XFRCNT: 0 ;NUMBER OF WORDS THIS TRANSFER
STARTA: 0 ;DSKDMP'S STARTING ADDRESS
KASIM: 0 ;-1 IF KA SIMULATION UCODE IS RUNNING
IFN DSKDSW,<
MUCKFL: 0 ;-1 IF MUCKING AROUND WITH LOW CORE CELLS
ZERFLG: 0 ;-1 TO ZERO CORE FIRST
FHILOC: 0 ;HILOC OF FILE WE ARE LOADING
UPPRST: 0 ;CORE ADDRESS OF START OF UPPER
TIBFLN←←20
TIBUF: BLOCK TIBFLN
FNAM: 0
FEXT: 0
0
FPPN: 0
DEFEXT: SIXBIT /DMP/ ;DEFAULT EXTENSION
DEFPPN: SIXBIT / SSYS/ ;DEFAULT PPN
>;DSKDSW
LIT
VAR
FF←←.
IFN DSKDSW,<
IFE DEBSW,<
END DSKDMP
>;IFE DEBSW
IFN DEBSW,<
END 300
>;DEBSW
>;DSKDSW
IFE DSKDSW,<
IFE KLBOOT,<
IFN DEBSW,<
END BOOT
>;DEBSW
IFE DEBSW,<
END PNCHGO
>;IFE DEBSW
>;IFE KLBOOT
IFN KLBOOT,<
END BOOT
>;KLBOOT
>;IFE DSKDSW